Conventional software system development for large-scale distributed systems consists of several stages of activities: writing source code for a program, testing subsystems of the program using unit tests, testing the entire program in isolation to validate its behavior, and integrating the program with other programs to ensure that they interoperate properly.